/*
 * @Author: Snitro
 * @Date: 2021-05-13 16:32:04
 * @LastEditors: Snitro
 * @LastEditTime: 2021-05-17 20:58:03
 * @Description: file content
 */
#include "key.h"

#include "stdio.h"

uint8_t scan_column() {
    uint8_t ret = 0;

    if (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13) == GPIO_PIN_SET) ret |= 1;
    if (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_14) == GPIO_PIN_SET) ret |= 2;
    if (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_15) == GPIO_PIN_SET) ret |= 4;
    if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4) == GPIO_PIN_SET) ret |= 8;

    return ret;
}

uint16_t scan() {
    uint16_t ret = 0;
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3,
                      GPIO_PIN_RESET);

    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);

    ret |= scan_column();

    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);

    ret |= scan_column() << 4;

    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);

    ret |= scan_column() << 8;

    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET);

    ret |= scan_column() << 12;

    return ret;
}

void key_scan(void) {
    uint16_t val = scan();

    HAL_Delay(10);

    val &= scan();

    static int8_t key_list[] = {-2, 0, -1, -3, 7, 8, 9, -6,
                                4,  5, 6,  -4, 1, 2, 3, -5};

    if (val) {
        uint8_t tot = 0;
        int i;

        for (i = 1; i <= 0x8000; i <<= 1) {
            if (val & i) key_press(key_list[tot]);
            tot++;
        }

        uint32_t systim = HAL_GetTick();

        while (HAL_GetTick() - systim <= 500 && (val = scan()) != 0)
            HAL_Delay(5);

        while ((val = scan()) != 0) {
            tot = 0;
            for (i = 1; i <= 0x8000; i <<= 1) {
                if (val & i) key_keep_press(key_list[tot]);
                tot++;
            }

            HAL_Delay(10);
        }
    }
}